package java_thinking.unit_10._10_6;

/**
 * @Description :   1.在匿名类中不可能有命名构造器(因为它根本没有名字)
 *                  但通过实例初始化，就能达到为匿名内部类创建一个构造器的效果
 *                  2.匿名内部类与正规的继承相比有些受限，因为匿名内部类既可以扩展类，也可以实现接口，
 *                  但是不能两者兼备，而且如果是实现接口也只能实现一个接口；
 *                  3.只要一个类是抽象的或是一个接口，那么其子类中的方法都可以使用匿名内部类来实现
 *                  最常用的情况就是在多线程的实现上，因为要实现多线程必须继承Thread类或是继承Runnable接口
 *
 *                  内部类：
 *                  1.静态内部类中可以有非静态的方法
 *                  2.当内部类中有静态方法或者静态成员变量时，一定是静态内部类
 * @author: cww
 * @DateTime: 2019-03-10 15:55
 */



class AnonymousConstructor {
    abstract static class Base {
        public Base(int i){
            System.out.println("Base constructor.i= "+i);
        }
        public abstract void f();
    }

    public static Base getBase(int i){
        /**
         * 这里不要求变量i一定是final的，因为i被传递给匿名类的基类的构造器。它并不会在匿名类内部被直接使用
         * ,如果“{}”内部引用了i那么编译器就会报错
         */
        return new Base(i) {
            {
                System.out.println("Inside instance of Base initializer");
            }
            @Override
            public void f() {
                System.out.println("In AnonymousConstructor f()");
            }
        };
        //上面的“;”是表达式的结束，不是类结束标识！！
    }
    public static void main(String [] args){
        Base base = getBase(9);
        base.f();
    }
}
